package com.example.springbootjavafx;

import com.example.springbootjavafx.util.SpringContextUtil;
import com.example.springbootjavafx.view.HelloView;
import de.saxsys.mvvmfx.FluentViewLoader;
import de.saxsys.mvvmfx.spring.MvvmfxSpringApplication;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * SpringbootJavaFxApplication 类是应用程序的入口点，它扩展了自定义的 MySrpingApplication 类，
 * 旨在整合Spring Boot和JavaFX技术，提供一个集成了Spring框架特性的JavaFX应用程序。
 *
 * @extend MySrpingApplication 该类扩展自 MySrpingApplication，利用继承来共享和重写特定于应用程序的逻辑。
 */
@SpringBootApplication
@MapperScan("com.example.springbootjavafx.mapper")
@Slf4j
public class SpringbootJavaFxApplication extends MvvmfxSpringApplication {


    public static void main(String[] args) {
        Application.launch(args);
    }

    /**
     * 当应用程序启动时，这个方法被调用，用于初始化MVVMFX框架的应用程序。
     * 它设置了应用程序的主舞台（Stage）和主视图（Parent）。
     *
     * @param stage 主舞台，应用程序将在这个舞台上展示其主视图。
     * @throws Exception 如果加载视图或初始化舞台时发生错误，将抛出异常。
     */
    @Override
    public void startMvvmfx(Stage stage) throws Exception {
        // 加载HelloView的FXML文件，并获取其根节点。
        Parent root = FluentViewLoader.fxmlView(HelloView.class).load().getView();
        // 注册一个Bean，将根节点（BorderPane）作为单例对象注册到Bean工厂中。
        // 这样可以在应用程序的其他部分通过依赖注入访问到这个根节点。
        SpringContextUtil.setBean("borderPane",(BorderPane)root);
        // 设置主舞台的标题。
        stage.setTitle("Hello!");
        // 设置主舞台的场景，场景包含应用程序的主视图。
        stage.setScene(new Scene(root, 940, 580));
        // 显示主舞台。
        stage.show();
    }

}
